//进⾏普通⽂件的复制
//将文件复制到另一个目录中，目录中没有这个文件

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

public class Demo2 {
    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);

        System.out.println("输入要复制的文件路径");
        String copy = scanner.next();
        File copyFile = new File(copy);
        if (!copyFile.exists()) {//文件不存在
            System.out.println("要复制的文件不存在");
            return;
        }

        if (copyFile.isDirectory()) {//文件不是普通文件
            System.out.println("文件不是普通文件");
        }

        System.out.println("输入要复制到的目标路径");
        String dir = scanner.next();
        File dirFile = new File(dir);
        if (!dirFile.exists()) {//目标路径不存在
            System.out.println("目标路径不存在");
            return;
        }
        if (!dirFile.isDirectory()) {//目标路径不是目录
            System.out.println("目标文件不是目录");
            return;
        }

        File targetFile = dirIsContainsCopyFile(dirFile, copyFile);//查找目录中是否包含这个文件,若找到，返回这个文件，若没有找到，返回null
        if (targetFile == null) {
            System.out.println("目录中没有这个文件");
            String target = dir + "\\" + copyFile.getName();//创建出目标文件
            targetFile = new File(target);
            System.out.println("新文件创建完成，文件路径: " + targetFile.getAbsoluteFile());
        } else {
            System.out.println("目录中已经有这个文件，是否覆盖？");
            System.out.println("是 y, 否 n");
            char flag = scanner.next().charAt(0);
            if (flag != 'y') {
                return;
            }
        }

//        try(InputStream inputStream = new FileInputStream(copyFile)) {//读
//            try(OutputStream outputStream = new FileOutputStream(targetFile)) {//写
//                while (true) {
//                    byte[] data = new byte[1024];
//                    int len = inputStream.read(data);
//                    if (len == -1) {
//                        System.out.println("复制完成");
//                        break;
//                    }
//                    outputStream.write(data, 0, len);
//                    outputStream.flush();
//                }
//            }
//        } catch (IOException e) {
//            throw new RuntimeException(e);
//        }

        try(InputStream inputStream = new FileInputStream(copyFile)) {//读/写汉字
            try (Scanner read = new Scanner(inputStream, StandardCharsets.UTF_8)) {
                try(OutputStream outputStream = new FileOutputStream(targetFile)) {
                    while (read.hasNext()) {
                        String str = read.next();
                        byte[] data = str.getBytes();
                        outputStream.write(data);
                        outputStream.flush();
                    }
                    System.out.println("复制完成");
                }
            }
        }

    }

    private static File dirIsContainsCopyFile(File dirFile, File copyFile) throws IOException {
        File[] files = dirFile.listFiles();
        if (files == null || files.length == 0) {
            return null;
        }
        for (File file : files) {
            if (file.isDirectory()) {
                dirIsContainsCopyFile(file, copyFile);
            } else {
                if (file.getName().equals(copyFile.getName())) {
                    return file;
                }
            }
        }
        return null;
    }
}
